﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using MIAP.DataAccess.Interfaces;
using MIAP.Entidades;

namespace MIAP.Negocio
{
    public class AdministrarArchivosNegocio
    {
          /// <summary>
        /// Instancia para el acceso a datos de Administración de archivos.
        /// </summary>
        private readonly IArchivosDao daoArchivos;

        /// <summary>
        /// Instancia para el acceso a datos de Formato Archivos
        /// </summary>
        private readonly IFormatoArchivoDao daoFormatoArchivos;

        /// <summary>
        /// Instancia para el acceso a datos de usuarios
        /// </summary>
        private readonly IUsuarioDao daoUsuarios;

        #region Constructor

        /// <summary>
        /// Inicializa una nueva instancia <see cref="AdministrarArchivosNegocio"/>
        /// </summary>
        public AdministrarArchivosNegocio()
        {
            this.daoArchivos = DataAccessFactory.Instance.CreateArchivosDao();
            this.daoFormatoArchivos = DataAccessFactory.Instance.CreateFormatoArchivosDao();
            this.daoUsuarios = DataAccessFactory.Instance.CreateUsuariosDao();     
              
        }

        #endregion

        #region Metodos


        /// <summary>
        /// Obtiene los usuarios que cargan la recarga del archivo
        /// </summary>
        /// <param name="idArchivo">id del archivo del quien buscaremos los usuarios que autorizan</param>
        /// <returns>Lista de usuarios que autorizan la recarga de arhivos</returns>
        public List<UsuarioInfo> GetUsuariosCargan(int idArchivo)
        {
            return this.daoUsuarios.GetUsuariosCargan(idArchivo).ToList();
        }

        /// <summary>
        /// Obtenemos los formatos de archivos existentes en la base de datos
        /// </summary>
        /// <returns></returns>
        public List<FormatoArchivoInfo> GetFormatosArchivo()
        {
            return this.daoFormatoArchivos.GetFormatosArchivo().ToList();

        }

        /// <summary>
        /// Obtiene todos los Archivos dependiendo del los filtros enviados, si no se requiere el filtro enviar NULL.
        /// </summary>
        /// <param name="nombreArchivo">nombre delarchivo a buscar</param>
        /// <param name="idProyecto">Es el id del proyecto del cual queremos obtener los archivos relacionados</param>
        /// <param name="idFormatoArchivo">id del formato de archivo</param>
        /// <param name="esObligatorio">True si es obligatorio, false en caso contrario</param>
        /// <param name="esVersion">true si es versión, false en caso contrario</param>
        /// <param name="estaActivo">true si esta activo, false en caso contrario</param>
        /// <returns>Lista con todos los Archivos.</returns>
        public List<ArchivoInfo> GetArchivos(string nombreArchivo,int? idProyecto,int? idFormatoArchivo,bool? esObligatorio,bool? esVersion,bool? estaActivo)
        {
            return  this.daoArchivos.GetArchivos(nombreArchivo, idProyecto, idFormatoArchivo, esObligatorio, esVersion,
                                         estaActivo).ToList();
        }

        /// <summary>
        /// Cambia el estatus del archivo
        /// </summary>
        /// <param name="idArchivo">id del archivo a cambiar el estatus</param>
        /// <param name="estatus">true si se cambia a activo false en caso contrario</param>
        public void ChangeEstatusArchivo(int idArchivo, bool estatus)
        {
            this.daoArchivos.ChangeEstatusArchivo(idArchivo,estatus);
        }

        /// <summary>
        /// obtiene los archivos a a partir de un id de proyecto
        /// </summary>
        /// <param name="idProyecto"></param>
        /// <returns></returns>
        public List<ArchivoInfo> GetArchivosByProyecto(int idProyecto)
        {
            return this.daoArchivos.GetArchivos(null, idProyecto, null, null, null, null).ToList()  ;
        }

        #endregion
    }
}
